import Queue from "./Queue";

/**
 * 支持两端元素插入和移除的线性集合。该接口定义了访问双端队列两端元素的方法。
 *
 * 该接口扩展了{@link Queue}接口。当双端队列用作队列时，会产生 FIFO（先进先出）行为。元素添加在双端队列的末尾并从开头删除。从{@link Queue}接
 * 口继承的原有方法与此接口中的对应方法完全等效。
 *
 * Deque也可以用作LIFO（后进先出）堆栈。当双端队列用作堆栈时，元素从双端队列的开头被压入和弹出。
 *
 * @param E 需要存入此双端队列的元素类型
 * @see Queue
 * @version 1.0
 */
export default interface Deque<E> extends Queue<E> {

  /**
   * 如果可以在不违反容量限制的情况下立即插入指定的元素，则在此双端队列的前面插入指定的元素，如果当前没有可用空间，则抛出
   * {@link FullCapacityException}。
   *
   * @param e 需要加入此双端队列的元素
   * @throws {FullCapacityException} 双端队列已经满了
   * @version 1.0
   */
  addFirst(e: E): void;

  /**
   * 如果可以在不违反容量限制的情况下立即插入指定的元素，则在此双端队列的末尾插入指定的元素，如果当前没有可用空间，则抛出
   * {@link FullCapacityException}。
   *
   * @param e 需要加入此双端队列的元素
   * @throws {FullCapacityException} 双端队列已经满了
   * @version 1.0
   */
  addLast(e: E): void;

  /**
   * 检索并删除此双端队列的第一个元素，如果此双端队列为空，则返回 undefined。
   *
   * @return {E | undefined} 此双端队列的第一个元素，若此双端队列为空，则返回undefined
   * @version 1.0
   */
  pollFirst(): E | undefined;

  /**
   * 检索并删除此双端队列的最后一个元素，如果此双端队列为空，则返回 undefined。
   *
   * @return {E | undefined} 此双端队列的最后一个元素，若此双端队列为空，则返回undefined
   * @version 1.0
   */
  pollLast(): E | undefined;

  /**
   * 检索但不删除此双端队列的第一个元素，如果此双端队列为空，则返回 undefined。
   *
   * @return {E | undefined} 此双端队列的第一个元素，若此双端队列为空，则返回undefined
   * @version 1.0
   */
  peekFirst(): E | undefined;

  /**
   * 检索但不删除此双端队列的最后一个元素，如果此双端队列为空，则返回 undefined。
   *
   * @return {E | undefined} 此双端队列的最后一个元素，若此双端队列为空，则返回undefined
   * @version 1.0
   */
  peekLast(): E | undefined;
}
